package keygen.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description: 获取系统IP,MAC地址
 * @Author: zhangzuoqiang
 * @Date: Sep 20, 2011
 */
public class SystemMessageUtil {

	public static void main(String[] args) {
		System.out.println("获取OSName：" + SystemMessageUtil.getOSName());
		System.out.println("获取LocalIp：" + SystemMessageUtil.getLocalIp());
		System.out.println("获取LocalMac：" + SystemMessageUtil.getLocalMac().get(1));
	}

	/**
	 * 获取当前操作系统名称. return 操作系统名称 例如:windows xp,linux 等.
	 */
	public static String getOSName() {
		return System.getProperty("os.name").toLowerCase();
	}

	/**
	 * <p>
	 * 方法 getLocalIp
	 * </p>
	 * 获取本机ip地址
	 * 
	 * @return
	 */
	public static String getLocalIp() {
		String localIp = null;
		try {
			localIp = InetAddress.getLocalHost().getHostAddress();
		} catch (UnknownHostException e) {
			System.out.println("获取服务器IP地址失败!");
			e.printStackTrace();
		}
		return localIp;
	}

	/**
	 * <p>
	 * 方法 getLocalMac
	 * </p>
	 * 获取本机MAC地址
	 * 
	 * @return
	 */
	public static List<String> getLocalMac() {
		String os = getOSName();
		List<String> result = new ArrayList<String>();
		try {
			// System.out.println(os);
			if (os.startsWith("windows")) {
				// 本地是windows
				result = getWindowsMACAddress();
				// System.out.println(mac);
			} else {
				// 本地是非windows系统 一般就是unix
				result = getUnixMACAddress();
				// System.out.println(mac);
			}
		} catch (Exception e) {
			System.out.println("获取服务器MAC地址失败!");
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 获取unix网卡的mac地址. 非windows的系统默认调用本方法获取.如果有特殊系统请继续扩充新的取mac地址方法.
	 * 
	 * @return mac地址
	 */
	private static List<String> getUnixMACAddress() {
		if (getOSName().startsWith("windows")) {
			return null;
		}
		List<String> result = new ArrayList<String>();
		String mac = null;
		BufferedReader bufferedReader = null;
		Process process = null;
		try {
			process = Runtime.getRuntime().exec("ifconfig eth0");// linux下的命令，一般取eth0作为本地主网卡
																	// 显示信息中包含有mac地址信息
			bufferedReader = new BufferedReader(new InputStreamReader(
					process.getInputStream()));
			String line = null;
			int index = -1;
			while ((line = bufferedReader.readLine()) != null) {
				index = line.toLowerCase().indexOf("hwaddr");// 寻找标示字符串[hwaddr]
				if (index >= 0) {// 找到了
					mac = line.substring(index + "hwaddr".length() + 1).trim();// 取出mac地址并去除2边空格
//					break;
					result.add(mac);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (bufferedReader != null) {
					bufferedReader.close();
				}
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			bufferedReader = null;
			process = null;
		}
		return result;
	}

	/**
	 * 获取widnows网卡的mac地址.
	 * 
	 * @return mac地址
	 */
	private static List<String> getWindowsMACAddress() {
		List<String> result = new ArrayList<String>();
		String mac = null;
		BufferedReader bufferedReader = null;
		Process process = null;
		try {
			// windows下的命令，显示信息中包含有mac地址信息
			process = Runtime.getRuntime().exec("ipconfig /all");
			bufferedReader = new BufferedReader(new InputStreamReader(
					process.getInputStream()));
			String line = null;
			int index = -1;
			while ((line = bufferedReader.readLine()) != null) {
				// 寻找标示字符串[physical address]
				index = line.toLowerCase().indexOf("physical address");
				if (index >= 0) {// 找到了
					index = line.indexOf(":");// 寻找":"的位置
					if (index >= 0) {
						// 取出mac地址并去除2边空格
						mac = line.substring(index + 1).trim();
						result.add(mac);
					}
					// break;
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (bufferedReader != null) {
					bufferedReader.close();
				}
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			bufferedReader = null;
			process = null;
		}
		return result;
	}

}
